tree model sort: Fix set_sort_column
authorMatthias Clasen <mclasen@redhat.com>
Tue, 16 Jan 2018 23:16:21 +0000 (18:16 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 16 Jan 2018 23:17:54 +0000 (18:17 -0500)
We were failing to change the sort order for the
default sort column in some cases. Fix that, and
add a testcase for this issue.

https://bugzilla.gnome.org/show_bug.cgi?id=792459

Add a testcase for the previous fix

gtk/gtktreemodelsort.c
testsuite/gtk/sortmodel.c

index 761e01fa555edb212d913a19791c64ca50c6e71e..aeffee9cb736f12e1ac825e9d559ddbb16e6a86a 100644 (file)
@@ -1684,6 +1684,9 @@ gtk_tree_model_sort_set_sort_column_id (GtkTreeSortable *sortable,
   GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *)sortable;
   GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
 
+  if (priv->sort_column_id == sort_column_id && priv->order == order)
+    return;
+
   if (sort_column_id != GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID)
     {
       if (sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
@@ -1699,17 +1702,6 @@ gtk_tree_model_sort_set_sort_column_id (GtkTreeSortable *sortable,
         }
       else
         g_return_if_fail (priv->default_sort_func != NULL);
-
-      if (priv->sort_column_id == sort_column_id)
-        {
-          if (sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
-           {
-             if (priv->order == order)
-               return;
-           }
-          else
-           return;
-        }
     }
 
   priv->sort_column_id = sort_column_id;
index a24f8a36307819c6cdb329ddeeeecaa4c2ef8b3c..f9a7eb188635bb4a64a80b6ef3953204dd61b8e5 100644 (file)
@@ -1202,6 +1202,93 @@ specific_bug_698846 (void)
   g_assert_cmpuint (count, ==, 2);
 }
 
+static int
+sort_func (GtkTreeModel *model,
+           GtkTreeIter  *a,
+           GtkTreeIter  *b,
+           gpointer      data)
+{
+  return 0;
+}
+
+static int column_changed;
+
+static void
+sort_column_changed (GtkTreeSortable *sortable)
+{
+  column_changed++;
+}
+
+static void
+sort_column_change (void)
+{
+  GtkListStore *store;
+  GtkTreeModel *sorted;
+  int col;
+  GtkSortType order;
+  gboolean ret;
+
+  g_test_bug ("792459");
+
+  store = gtk_list_store_new (1, G_TYPE_STRING);
+  sorted = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
+
+  column_changed = 0;
+  g_signal_connect (sorted, "sort-column-changed", G_CALLBACK (sort_column_changed), NULL);
+
+  g_assert (!gtk_tree_sortable_has_default_sort_func (GTK_TREE_SORTABLE (sorted)));
+  gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (sorted), sort_func, NULL, NULL);
+  g_assert (gtk_tree_sortable_has_default_sort_func (GTK_TREE_SORTABLE (sorted)));
+
+  gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sorted), 0, sort_func, NULL, NULL);
+
+  ret = gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (sorted), &col, &order);
+  g_assert (column_changed == 0);
+  g_assert (ret == FALSE);
+  g_assert (col == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID);
+  g_assert (order == GTK_SORT_ASCENDING);
+
+  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sorted),
+                                        GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_DESCENDING);
+  ret = gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (sorted), &col, &order);
+  g_assert (column_changed == 1);
+  g_assert (ret == FALSE);
+  g_assert (col == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID);
+  g_assert (order == GTK_SORT_DESCENDING);
+
+  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sorted),
+                                        GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_DESCENDING);
+  ret = gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (sorted), &col, &order);
+  g_assert (column_changed == 1);
+  g_assert (ret == FALSE);
+  g_assert (col == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID);
+  g_assert (order == GTK_SORT_DESCENDING);
+
+  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sorted),
+                                        0, GTK_SORT_DESCENDING);
+  ret = gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (sorted), &col, &order);
+  g_assert (column_changed == 2);
+  g_assert (ret == TRUE);
+  g_assert (col == 0);
+  g_assert (order == GTK_SORT_DESCENDING);
+
+  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sorted),
+                                        GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
+  ret = gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (sorted), &col, &order);
+  g_assert (column_changed == 3);
+  g_assert (ret == FALSE);
+  g_assert (col == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID);
+  g_assert (order == GTK_SORT_ASCENDING);
+
+  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sorted),
+                                        GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
+  ret = gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (sorted), &col, &order);
+  g_assert (column_changed == 4);
+  g_assert (ret == FALSE);
+  g_assert (col == GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID);
+  g_assert (order == GTK_SORT_ASCENDING);
+}
+
 /* main */
 
 void
@@ -1239,5 +1326,7 @@ register_sort_model_tests (void)
                    specific_bug_674587);
   g_test_add_func ("/TreeModelSort/specific/bug-698846",
                    specific_bug_698846);
+  g_test_add_func ("/TreeModelSort/specific/bug-792459",
+                   sort_column_change);
 }